package com.itheima.admin.listener;

import com.alibaba.nacos.common.utils.UuidUtils;
import com.itheima.admin.service.WemediaNewsAutoScanService;
import com.itheima.common.constants.BusinessConstants;
import com.itheima.common.exception.LeadNewsException;
import lombok.extern.slf4j.Slf4j;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.UUID;

/**
 * @version 1.0
 * @description 说明
 * @package com.itheima.admin.listener
 */
@Component
@Slf4j
public class WemediaNewsAutoScanListener {

    @Resource
    private WemediaNewsAutoScanService wemediaNewsAutoScanService;

    /**
     * 文章的自动审核
     * @param msg
     */
    @KafkaListener(topics = BusinessConstants.MqConstants.WM_NEWS_AUTO_SCAN_TOPIC)
    public void autoScanWmNews(ConsumerRecord<String,String> msg){
        int p = msg.partition();
        long o = msg.offset();
        String value = msg.value();
        // 为了记录日志，添加唯一标记，日志异步打印。
        String uuid = UUID.randomUUID().toString();
        log.info("开始执行文章自动审核..:{},{},{},{}",uuid,p,o,value);
        long wmNewsId = Long.parseLong(value);
        // 自动审核
        try {
            wemediaNewsAutoScanService.autoScanWemediaNewsById(uuid, wmNewsId);
            log.info("执行文章自动审核成功..:{},{},{},{}",uuid,p,o,value);
            // 其实不必try catch。使用RabbitMQ来做自动审核最合适的。
            // 失败后重试，重试次数耗尽时，进入死信，死信由运维人员来处理，运维人员马上就去处理。它是一种及时处理方案
        } catch (Exception e) {
            log.error("文章自动审核出错了,需要运维人员介入!{},{},{},{}",uuid, e);
            //1. 发短信通知、发邮件通知
            //2. 所有出错转人工审核
            //3. 使用失败时重试，重试耗尽时再通知运维。推荐使用RabbitMQ来处理
        }
        log.info("执行文章自动审核完成..:{},{},{},{}",uuid,p,o,value);
    }
}
